"""
所有的数据库model定义

包含系统所有数据表模型：
- 用户表 (User)
- 角色表 (Role)
- 权限表 (Permission)
- 用户角色关联表 (UserRole)
- 角色权限关联表 (RolePermission)
- 组件表 (Widget)
- 用户组件关联表 (UserWidget)
"""

from sqlalchemy import Column, Integer, DateTime, String, func, Boolean, Text
from db.session import Base


class BaseTable(Base):
    """
    公共表父类
    
    所有数据表的基类，包含公共字段：
    - id: 主键ID
    - create_time: 创建时间
    - update_time: 更新时间
    """

    __abstract__ = True
    __table_args__ = {"mysql_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"}

    id = Column(Integer, primary_key=True, autoincrement=True, comment="模型ID")
    create_time = Column(DateTime, default=func.now(), comment="创建时间")
    update_time = Column(DateTime, default=func.now(), onupdate=func.now())


class User(BaseTable):
    """
    用户表
    
    存储用户基本信息，包括：
    - 基本信息：用户名、邮箱、密码
    - 状态信息：激活状态、管理员状态
    - 扩展信息：全名、头像、个人简介
    - 关联关系：用户角色关联
    """
    __tablename__ = 'user'
    
    username = Column(String(50), unique=True, nullable=False, comment="用户名")
    email = Column(String(100), unique=True, nullable=False, comment="邮箱")
    hashed_password = Column(String(255), nullable=False, comment="密码哈希")
    is_active = Column(Boolean, default=True, comment="是否激活")
    is_admin = Column(Boolean, default=False, comment="是否管理员")
    full_name = Column(String(100), nullable=True, comment="全名")
    avatar_url = Column(String(255), nullable=True, comment="头像URL")
    bio = Column(Text, nullable=True, comment="个人简介")
    
  

class Role(BaseTable):
    """
    角色表
    
    存储角色信息，包括：
    - 基本信息：角色名称、角色代码
    - 描述信息：角色描述
    - 状态信息：激活状态
    - 关联关系：角色权限关联、用户角色关联
    """
    __tablename__ = 'role'
    
    name = Column(String(50), nullable=False, comment="角色名称")
    code = Column(String(50), unique=True, nullable=False, comment="角色代码")
    description = Column(Text, nullable=True, comment="角色描述")
    is_active = Column(Boolean, default=True, comment="是否激活")
    
    

class Permission(BaseTable):
    """
    权限表
    
    存储权限信息，包括：
    - 基本信息：权限名称、权限代码
    - 权限结构：资源名称、操作类型
    - 描述信息：权限描述
    - 关联关系：角色权限关联
    """
    __tablename__ = 'permission'
    
    name = Column(String(100), nullable=False, comment="权限名称")
    code = Column(String(100), unique=True, nullable=False, comment="权限代码")
    resource = Column(String(100), nullable=False, comment="资源名称")
    action = Column(String(50), nullable=False, comment="操作类型")
    description = Column(Text, nullable=True, comment="权限描述")
    
    

class RolePermission(BaseTable):
    """
    角色权限关联表
    
    存储角色和权限的关联关系，实现角色权限管理
    """
    __tablename__ = 'role_permission'
    
    role_id = Column(Integer, nullable=False, comment="角色ID")
    permission_id = Column(Integer, nullable=False, comment="权限ID")


class UserRole(BaseTable):
    """
    用户角色关联表
    
    存储用户和角色的关联关系，实现用户角色管理
    """
    __tablename__ = 'user_role'
    
    user_id = Column(Integer, nullable=False, comment="用户ID")
    role_id = Column(Integer, nullable=False, comment="角色ID")


class Widget(BaseTable):
    """
    组件表
    
    存储组件信息，包括：
    - 基本信息：组件名称、版本号、描述
    - 作者信息：作者ID
    - 分类信息：分类、激活状态
    - 配置信息：配置JSON Schema、API端点、前端文件
    """
    __tablename__ = 'widget'
    
    name = Column(String(100), nullable=False, comment="组件名称")
    version = Column(String(20), nullable=False, comment="版本号")
    description = Column(Text, nullable=True, comment="组件描述")
    author_id = Column(Integer, nullable=False, comment="作者ID")
    category = Column(String(50), nullable=True, comment="分类")
    is_active = Column(Boolean, default=True, comment="是否激活")
    config_schema = Column(Text, nullable=True, comment="配置JSON Schema")
    api_endpoints = Column(Text, nullable=True, comment="API端点定义")
    frontend_files = Column(Text, nullable=True, comment="前端文件信息")


class UserWidget(BaseTable):
    """
    用户组件关联表
    
    存储用户和组件的关联关系，实现用户组件管理
    """
    __tablename__ = 'user_widget'
    
    user_id = Column(Integer, nullable=False, comment="用户ID")
    widget_id = Column(Integer, nullable=False, comment="组件ID")
    is_enabled = Column(Boolean, default=True, comment="是否启用")
    config_data = Column(Text, nullable=True, comment="配置数据")
